﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SIBI.Models;
using PagedList;

namespace SIBI.Controllers
{
    [Authorize]
    public class MarcaModeloController : Controller
    {
        private SIBIContext db = new SIBIContext();

        //***********************************************************************************//
        // Autor:  										                    				*//
		//***********************************************************************************//
		// Index()													 						*//
		// Función que devuelve la vista de todos los ítems de MarcaModelo listados en la 	*//
		// pantalla.																		*//
		// _________________________________________________________________________________*//
		// Entrada: None                                        							*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee todos los MarcaModelo listados.							*//
		// _________________________________________________________________________________*//
        public ViewResult Index()
        {
            var marcamodeloes = db.MarcaModeloes.Include(m => m.nmar).Include(m => m.ncob);
            return View(marcamodeloes.ToList());
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// GetMarcasModelos()																*//
		// Función que devuelve la vista de todos las MarcaModelo del sitema	para asi	*// 
		//  listarlos en las funciones de autocompletado del sistema. 						*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	query: String llenado en el autocompletado, utilizado para buscar			*//
		// 		las MarcaModelo que coincidan en BD.	 									*//
		// _________________________________________________________________________________*//
		// Salida:  Arreglo que posee todos las MarcaModelo que conciden con el String de 	*//
		// busqueda.																		*//
		// _________________________________________________________________________________*//
        [HttpPost]
        public ActionResult GetMarcasModelos(string query)
        {
			//Filtrado de los Marca Modelo por los paremetros de entrada
            var marcasmodelos = (from mm in db.MarcaModeloes
                       where (
                                mm.cmod.Contains(query) ||
                                mm.nmar.cnom.Contains(query) ||
                                mm.ncob.cnom.Contains(query)
                             )
                        select new { 
                                MarcaModeloId = mm.MarcaModeloId, 
                                Modelo = mm.cmod, 
                                Marca = mm.nmar.cnom, 
                                ClaseObjeto = mm.ncob.cnom 
                        }).Take(15).ToArray();
            return Json(marcasmodelos);
        }

		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// SearchIndex()	Acceso INVITADO	y ADMINISTRADOR									*//
		// Acción que devuelve la vista de todos los ítems de MarcaModelo listados,         *//
        // paginados y con opción de búsqueda.		 									    *//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
		// 		búsqueda, por defecto es 1.													*//
		// •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
		// 		búsqueda. 																	*//
		// •	Parámetros con prefijo current: caracteres que guardan la ultima búsqueda de*// 
		// 		filtrado para mantenerla durante los cambios de página. 					*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee todos los MarcaModelo listados deseados.				*//
		// _________________________________________________________________________________*//
        public ActionResult SearchIndex(string currentNPer, string searchNPer, 
                            string currentEmp, string searchEmp, int? page = 1)
        {

            var car = from m in db.MarcaModeloes
                      select m;

			//Metodo GET Inicializar las variables con los valores de busqueda introducidos
            if (Request.HttpMethod == "GET")
            {
                searchNPer = currentNPer;
                searchEmp = currentEmp;

            }
            else
            {
                page = 1;
            }
			
			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.CurrentNPer = searchNPer;
            ViewBag.CurrentEmp = searchEmp;

            int pageSize = 10;
            int pageIndex = (page ?? 1) - 1;

			//Filtrado por los parametros en entreda capturado en al interfaz
            if (!String.IsNullOrEmpty(searchNPer))
            {
                car = car.Where(s => s.cmod.Contains(searchNPer));
            }

            if (!String.IsNullOrEmpty(searchEmp))
            {
                car = car.Where(s => s.ncob.cnom.Contains(searchEmp));
            }

			//Ordenar los BI del return
            car = car.OrderBy(x => x.ncob.cnom);

            return View(car.ToPagedList(pageIndex, pageSize));
        }

		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// Details()	Acceso INVITADO	y ADMINISTRADOR										*//
		// Función que devuelve la vista de los detalles de una MarcaModelo especificada.	*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador de la MarcaModelo que se desea ver los detalles. 			*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee todos los datos de la MarcaModelo desada.				*//
		// _________________________________________________________________________________*//
        public ViewResult Details(int id)
        {
            MarcaModelo marcamodelo = db.MarcaModeloes.Find(id);
            return View(marcamodelo);
        }

		//***********************************************************************************//
        // Autor:  								                		     				*//
		//***********************************************************************************//
		// Create()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista que permite crear una MarcaModelo especificada. 	*//
		// Método GET.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 		none															*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee la plantilla para crear la MarcaModelo desada.			*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Create()
        {
            ViewBag.MarcaId = new SelectList(db.Marcas, "MarcaId", "cnom");
            ViewBag.ClaseObjetoId = new SelectList(db.ClaseObjetoes, "ClaseObjetoId", "cnom");
            return View();
        }
       
		//***********************************************************************************//
        // Autor:  							                			     				*//
		//***********************************************************************************//
		// Create()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista que permite crear una MarcaModelo especificada. 	*//
		// Método POST.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	marcamodelo: dato de tipo modelo, que representa un MarcaModelo, este es 	*//
		//		requerido para verificar que los datos suministrados son correctos,  para 	*//
		//		así crear o enviar un mensaje de error en la aplicación. 					*//													*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve la MarcaModelo creada.								*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Create(MarcaModelo marcamodelo)
        {
            var validModelo = (from m in db.MarcaModeloes
                            where m.cmod == marcamodelo.cmod
                            select m.cmod).ToList();

            if (validModelo.Count() == 0)
            {
                if (ModelState.IsValid)
                {
                    db.MarcaModeloes.Add(marcamodelo);
                    db.SaveChanges();
                    return RedirectToAction("SearchIndex");  
                }
            }
            else
                ViewBag.DuplicateModelo = "Modelo Duplicado";

            ViewBag.MarcaId = new SelectList(db.Marcas, "MarcaId", "cnom", marcamodelo.MarcaId);
            ViewBag.ClaseObjetoId = new SelectList(db.ClaseObjetoes, "ClaseObjetoId", "cnom", marcamodelo.ClaseObjetoId);
            return View(marcamodelo);
        }

		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// Edit()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista que permite  Editar una MarcaModelo especificada. 	*//
		// Método GET.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador de la Marca Modelo que se desea editar.					*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee la plantilla para  Editar la MarcaModelo desada.		*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Edit(int id)
        {
            MarcaModelo marcamodelo = db.MarcaModeloes.Find(id);
            ViewBag.MarcaId = new SelectList(db.Marcas, "MarcaId", "cnom", marcamodelo.MarcaId);
            ViewBag.ClaseObjetoId = new SelectList(db.ClaseObjetoes, "ClaseObjetoId", "cnom", marcamodelo.ClaseObjetoId);
            return View(marcamodelo);
        }
       
		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// Edit()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista que permite Editar una MarcaModelo especificada. 	*//
		// Método POST.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	marcamodelo: dato de tipo modelo, que representa un MarcaModelo, este es 	*//
		//		requerido para verificar que los datos suministrados son correctos,  para 	*//
		//		así Editar o enviar un mensaje de error en la aplicación. 					*//													*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve la MarcaModelo Editada.								*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Edit(MarcaModelo marcamodelo)
        {
            if (ModelState.IsValid)
            {
                db.Entry(marcamodelo).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("SearchIndex");
            }
            ViewBag.MarcaId = new SelectList(db.Marcas, "MarcaId", "cnom", marcamodelo.MarcaId);
            ViewBag.ClaseObjetoId = new SelectList(db.ClaseObjetoes, "ClaseObjetoId", "cnom", marcamodelo.ClaseObjetoId);
            return View(marcamodelo);
        }

		//***********************************************************************************//
        // Autor:  								                		     				*//
		//***********************************************************************************//
		// Delete()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista que permite eliminar una MarcaModelo especificada. 	*//
		// Método GET.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador de la Marca Modelo que se desea eliminar.					*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee la plantilla para  eliminar la MarcaModelo desada.		*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Delete(int id)
        {
            MarcaModelo marcamodelo = db.MarcaModeloes.Find(id);
            return View(marcamodelo);
        }

		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// DeleteConfirmed()	Acceso solo ADMINISTRADOR									*//
		// Acción que devuelve la vista que permite elimininar una MarcaModelo especificada.*//
		// Método POST.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador de la MarcaModelo que va a eliminar.						*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que muestra la eliminación de la MarcaModelo desada.				*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {            
            MarcaModelo marcamodelo = db.MarcaModeloes.Find(id);

            var bieninformatico = (from m in db.BienInformaticoes
                        where m.MarcaModeloId == marcamodelo.MarcaModeloId 
                        select m.BienInformaticoId).ToList();
            if (bieninformatico.Count() == 0)
            {
                db.MarcaModeloes.Remove(marcamodelo);
                db.SaveChanges();
                return RedirectToAction("SearchIndex");
            }
            else
            {
                return RedirectToAction("Confirmacion");
            }
        }

		//***********************************************************************************//
        // Autor:  									                	     				*//
		//***********************************************************************************//
		// Confirmacion()	Acceso solo ADMINISTRADOR										*//
		// Acción que devuelve la vista q informa si la MarcaModelo esta asociada a algún BI*//
		// Método GET.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 	none																*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve la pantalla de asociación a un BI.					*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ViewResult Confirmacion () {
            return View();
        }


        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}